from openai import OpenAI
import math

client = OpenAI(
    api_key="llm_studio_api_key",
    base_url="http://localhost:1234/v1"
)
client_1 = OpenAI(
    api_key="sk-ei8uyxeu47EKCl7xk4opKkdmRClk6E7u1Gwnpvswr93xdrrO",
    base_url="https://api.chatfire.cn/v1"
)
client_2 = OpenAI(
    api_key="sk-a2771a849211463b9f94788a4bd3a3c1",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

def embedding(text: str, model: str):
    response = client.embeddings.create(
        model=model,
        input=text
    )
    return response.data[0].embedding
def embedding_openai(text: str, model: str):
    response = client_1.embeddings.create(
        model=model,
        input=text
    )
    return response.data[0].embedding

def embedding_qwen(text: str, model: str):
    response = client_2.embeddings.create(
        model=model,
        input=text
    )
    return response.data[0].embedding

def cosine_similarity(vec1: list[float], vec2: list[float], eps: float = 1e-10) -> float:
    """
    计算两个向量的余弦相似度（支持不同维度）

    参数:
        vec1: 第一个向量 (list[float])
        vec2: 第二个向量 (list[float])
        eps: 防止除零的小常数 (默认1e-10)

    返回:
        float: 余弦相似度值 (范围[-1, 1])
    """
    # 统一向量维度（短向量末尾补0）
    max_len = max(len(vec1), len(vec2))
    v1 = vec1 + [0.0] * (max_len - len(vec1))
    v2 = vec2 + [0.0] * (max_len - len(vec2))

    # 计算点积
    dot_product = sum(x * y for x, y in zip(v1, v2))

    # 计算模长
    norm1 = math.sqrt(sum(x ** 2 for x in v1))
    norm2 = math.sqrt(sum(y ** 2 for y in v2))

    # 处理零向量特殊情况
    if norm1 < eps and norm2 < eps:
        return 1.0  # 两个零向量定义为完全相似
    elif norm1 < eps or norm2 < eps:
        return 0.0  # 零向量与非零向量不相似

    # 返回余弦相似度
    return dot_product / (norm1 * norm2)

if __name__ == '__main__':
    model_1 = "text-embedding-nomic-embed-text-v1.5@q4_k_m" # 0.8454 0.6622 0.8213 0.8213
    model_2 = "text-embedding-bge-m3" # 0.8611 0.7477 0.7248 0.7539
    model_3 = "text-embedding-3-small" # 0.6811 0.5824 0.7304 0.6509
    model_4 = "text-embedding-3-large" # 0.6277 0.5789 0.7188 0.5770
    model_5 = "text-embedding-nomic-embed-text-v1.5@q8_0" # 0.8064 0.6451 0.8223 0.8061
    model_6 = "text-embedding-all-minilm-l6-v2-embedding" # 0.7898 0.4942 0.6899 0.7065
    model_7 = "text-embedding-v3" # 0.8434 0.7754 0.7454 0.7707
    model_8 = "text-embedding-nomic-embed-text-v2-moe@q4_k_m" # 0.7042 0.5312 0.6870 0.6175
    model_9 = "text-embedding-nomic-embed-text-v2-moe@q8_0" # 0.7009 0.5401 0.6645 0.5902
    text_1 = "我住在中华人民共和国。"
    text_2 = "本人居住在中国。"
    text_3 = "明天午后可能有雷阵雨，出门记得带伞"
    text_4 = "气象台发布雷电黄色预警，建议市民备好防雨工具"
    text_5 = "近年来，生成式人工智能的爆发性增长彻底改变了人机交互模式。以 ChatGPT 为代表的大语言模型，通过海量文本预训练掌握了跨领域知识推理能力，不仅能撰写学术论文、编写程序代码，还可模拟人类情感对话。这种技术突破既推动了教育、医疗等行业的效率革命，也引发了关于伦理边界与就业替代的激烈争论。专家呼吁建立全球性监管框架，确保技术向善发展。"
    text_6 = "当 ChatGPT 在 2023 年掀起 AI 浪潮时，世界突然意识到：机器已能创作诗歌、诊断疾病甚至通过律师资格考试。这种颠覆性进步虽加速了生产力变革，却同时埋下隐患——失业恐慌与道德困境如影随形。斯坦福研究院报告指出，若缺乏跨国协同治理，算法偏见可能加剧社会分裂。人类站在技术奇点前，必须重新定义“智能”与“价值”的关系。"
    text_a = "尽管实验初期结果积极，最终方案却被证明不可行"
    text_b = "虽然初步数据令人鼓舞，但该方法实际应用效果欠佳"
    embedding_1 = embedding(text_5, model_9)
    embedding_2 = embedding(text_6, model_9)
    similarity = cosine_similarity(embedding_1, embedding_2)
    print(f"Cosine Similarity: {similarity:.4f}")


